#ifndef TASKS_INC
#define TASKS_INC

#include <iostream>
#include <cstdlib>
#include <omp.h>
#include <mpi.h>

#include "ErathostenesSieve.h"
#include "Parser.h"
#include "Reader.h"
#include "Palindrome.h"
#include "buffer.h"
#include "Chronometer.h"

using namespace std;

/*-----------------------------------------------------------------------------
 *  Inicializa as variáveis globais
 *-----------------------------------------------------------------------------*/
void initVars(int *argc, char **argv[]);

/*-----------------------------------------------------------------------------
 *  Deleta as variáveis globais
 *-----------------------------------------------------------------------------*/
void deleteVars();

/*-----------------------------------------------------------------------------
 *  Função que obtém o rank e calcula os offsets para o Parser
 *-----------------------------------------------------------------------------*/
void calculateOffset();

/*-----------------------------------------------------------------------------
 *  Função que lê um bloco do arquivo de entrada
 *-----------------------------------------------------------------------------*/
void readFromInputFile(uint i);

/*-----------------------------------------------------------------------------
 *  Função que divide o bloco em palavras e/ou frase
 *-----------------------------------------------------------------------------*/
void tokenizeBlock(uint i);

/*-----------------------------------------------------------------------------
 *  Função que verifica se as palavrase e/ou frases são palíndromas e de soma prima
 *-----------------------------------------------------------------------------*/
void checkForPalindromes(uint i);

/*-----------------------------------------------------------------------------
 *  Modo (1 - dicionário e 2 - livro)
 *-----------------------------------------------------------------------------*/
extern int mode;

/*-----------------------------------------------------------------------------
 *  Leitor de arquivo
 *-----------------------------------------------------------------------------*/
extern Reader *reader;

/*-----------------------------------------------------------------------------
 *  Parser para palavras e para frases
 *-----------------------------------------------------------------------------*/
extern Parser *wparser;
extern Parser *pparser;

/*-----------------------------------------------------------------------------
 *  Verificador de palíndromos para as palavras e para frases
 *-----------------------------------------------------------------------------*/
extern PalindromeUtil *wputil;
extern PalindromeUtil *pputil;

/*-----------------------------------------------------------------------------
 *  Verificador de números primos
 *-----------------------------------------------------------------------------*/
extern ErathostenesSieve *sieve;

/*-----------------------------------------------------------------------------
 *  Indica se o parser de palavras e de frases já acabou
 *-----------------------------------------------------------------------------*/
extern bool isWParserFinished;
extern bool isPParserFinished;

/*-----------------------------------------------------------------------------
 *  Indica se o verificador de palíndromos para palavras e para frases já acabou
 *-----------------------------------------------------------------------------*/
extern bool isWPalinsFinished;
extern bool isPPalinsFinished;

/*-----------------------------------------------------------------------------
 *  Tamanho do arquivo em bytes
 *-----------------------------------------------------------------------------*/
extern ulong length;

/*-----------------------------------------------------------------------------
 *  Rank da máquina e a quantidade total de máquinas
 *-----------------------------------------------------------------------------*/
extern int rank, tasks;

/*-----------------------------------------------------------------------------
 *  Offset que deve ser dado pela máquina e o tamanho de bytes que deve ser lido
 *-----------------------------------------------------------------------------*/
extern ulong offset, size;

/*-----------------------------------------------------------------------------
 *  Variáveis de contagem de tempo para cada uma das etapas
 *-----------------------------------------------------------------------------*/
extern double readTime, parserTime, palinTime, primeTime;

#endif
